package springboot.netty;

import springboot.http.HttpClientTools;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.ReferenceCountUtil;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class SimpleServerHandler extends ChannelInboundHandlerAdapter {
    public static List<Channel> channels = new ArrayList<>();
    //开门的指令[开门时没有关门的指令]
    //前端界面处于开门模式或者关门模式，其中的任何一种时，另一种一定为false
    //比如处于开门模式时，close_door一定为false
    //处于关门模式时
    public static boolean open_door;
    //关门的指令[关门时没有开门的指令]
    public static boolean close_door;
    //作为关门的标志
    int i=0;
    byte[] data = new byte[9];
    int flagSendGet=0;
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        Channel inChannel=ctx.channel();
        if(channels.size()==0){//如果没有连接就进行连接就对了
            channels.add(inChannel);
            System.out.println("=== " + ctx.channel().remoteAddress() + " is active ===");
        }
    }


    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws InterruptedException, IOException {
        ByteBuf buf = (ByteBuf) msg;
        byte[] bytes = new byte[buf.readableBytes()];
        buf.readBytes(bytes);
        /*if (bytes.length >= 9) {
            System.out.println(bytes[3]+","+bytes[4]+","+bytes[5]+","+bytes[6]);
        }*/
        //Manual recycling to prevent memory leakage;
        ReferenceCountUtil.release(buf);

        data[0] = 2;//报文头
        data[1] = 5;//有效的数据长度
        data[2] = 86;//标志位
        data[7] = 0;//和校验
        data[8] = 3;//报文尾

        data[3]= (byte) (data[3]+1);//data[3]作为心跳存在
        //data[4]作为开门的命令存在
        /*System.out.println(open_door+"=========="+close_door);*/
        if (open_door){
            data[4]=1;
            data[5]=0;
        }else{
            data[4]=0;
        }
        //data[5]作为关门的命令存在
        if (close_door){
            i++;
            data[4]=0;
            data[5]=1;
        }else{
            data[5]=0;
        }
        if(i>8){
            close_door=false;
            i=0;
        }
        //如果发生开门的事件，那么就发送get请求到controller中，但只发送一次,直到关门才复位
        if (data[4]==1&&flagSendGet==0){
            String result=HttpClientTools.sendGetData("http://localhost:9998/list","utf-8");
            System.out.println(result);
            flagSendGet=1;
        }
        if (data[4]!=1&&flagSendGet==1){
            flagSendGet=0;
        }
        //如果发生开门的事件，那么就发送get请求到controller中，直到接收到回馈的内容,直到关门才复位

        //data[6]暂时不考虑
        ByteBuf json = Unpooled.wrappedBuffer(data);

        ctx.writeAndFlush(json);
    }
}
